package com.example.flow

import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.flatMapConcat
import kotlinx.coroutines.flow.flow
import kotlinx.coroutines.runBlocking

/**
flatMapConcat操作符
 （1）接口依赖关系，串行执行，容易出现嵌套地狱
 （2）使用flatMapConcat解决嵌套地狱，平级的关系完成
flatMapMerge操作符等价于flatMapConcat操作符，不保证顺序
flatMapLatest操作符等价于flatMapConcat操作符，新数据到达会丢弃上一个数据未处理完的逻辑
 */

fun main(){
    runBlocking {
        sendGetTokenRequest()
            .flatMapConcat { token->
                sendGetUserInfoRequest(token)
            }
            .flatMapConcat { userId->
                sendGetUserOrderInfoRequest(userId)
            }.collect{
                println(it)
            }

    }
}

/**
 * 接口1:获得token
 */
fun sendGetTokenRequest(): Flow<String> = flow {
    // send request to get token
    emit("token")
}
/**
 * 接口2:用获得token获得用户信息
 */
fun sendGetUserInfoRequest(token: String): Flow<String> = flow {
    // send request with token to get user info
    emit("用户信息")
}

/**
 * 接口3:根据用户信息获得订单信息
 */
fun sendGetUserOrderInfoRequest(userId: String): Flow<String> = flow {
    // send request with token to get user info
    emit("订单信息")
}




